#ifndef _MINESWEEPER_
#define _MINESWEEPER_

#include <iostream>

/*
C 语言头文件三剑客
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*
利用宏常量定义整个雷区大小
    ROW 雷区行数
    COL 雷区列数
    MINE_COUNT 雷区地雷个数
*/
#define ROW 10
#define COL 10
#define MINE_COUNT 1

#define EXPLORE 1
#define MARK 2
#define CANCEL_MARK 3

/*
第一个功能函数: 用户游戏界面初始化函数
*/
/**
 * 用户界面初始化函数，参数是一个 char 类型的二维数组，要求
 * 每一个元素位置都是字符 '*' 号
 *
 * @param mine_ui 用户游戏界面
 */
void mine_ui_init(char mine_ui[][COL]);

/**
 * 展示用户游戏界面，也可以对雷区数据进行展示
 *
 * @param  mine_ui 用户游戏界面或者雷区数组
 */
void show_mine_ui(char mine_ui[][COL]);

/**
 * 雷区初始化函数，利用随机数方式对雷区布雷位置进行下标确定，周边
 * 其他区不超过雷区范围，同时不是地雷的区域，都需要 += 1
 *
 * @param mine_area 真实雷区数组
 */
void mine_area_init(char mine_area[][COL]);

/**
 * 探索函数实现: 用户提供探索的下标位置，需要从真实雷区校验当前探索
 * 是否踩雷
 *      如果踩雷，返回 0
 *      如果没有踩雷，需要将真实雷区中对应数字字符，拷贝到用户界面，返回 1
 *
 * @param mine_ui   用户界面 char 类型二维数组
 * @param mine_area 真实雷区数据 char 类型二维数组
 * @param row_index 用户指定探索的行下标。用户提供数据为 1 ~ 10 有效数据，需要二次处理
 * @param col_index 用户指定探索的列下标。用户提供数据为 1 ~ 10 有效数据，需要二次处理
 * @return 如果探索成功返回 1，否则返回 0
 */
int explore_mine_area(char mine_ui[][COL],
                      char mine_area[][COL],
                      int row_index,
                      int col_index);

#if 0
/*
标记操作，需要和真实雷区进行比对，当前函数有三种执行结果
    1. 用户提供下标数据不合法
    2. 用户提供下标位置标记成功，对应位置确实为雷区
    3. 用户提供下标位置标记失败，对应位置非地雷
*/
#endif 
/**
 * 标记雷区操作，需要用户提供对应的下标位置，和真实雷区进行校验
 * 存在三种情况返回结果。
 * 
 * @param mine_ui   用户界面 char 类型二维数组
 * @param mine_area 真实雷区数据 char 类型二维数组
 * @param row_index 用户指定探索的行下标。用户提供数据为 1 ~ 10 有效数据，需要二次处理
 * @param col_index 用户指定探索的列下标。用户提供数据为 1 ~ 10 有效数据，需要二次处理
 * @return  返回结果为 int 类型，存在三种情况
 *      1. 用户提供下标数据不合法，返回 -1
 *      2. 用户提供下标位置标记成功，对应位置确实为雷区 ，返回 1
 *      3. 用户提供下标位置标记失败，对应位置非地雷，返回 0
 */
int mark_mine(char mine_ui[][COL],
              char mine_area[][COL],
              int row_index,
              int col_index);                    

#endif